package com.fingard.dsp.bank.directbank.zjdsf01.util;

import java.util.HashMap;
import java.util.Map;

import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.ptr.ByteByReference;

/**
 * TCP通讯工具类
 * 
 * 工具类使用说明:
 * <p>
 * 一、原始C语言编写dll函数定义:
 * <p>
 * 1. int sendYHTBWFile( char *pszIPAddr, char *pszPort, char *szSndFName);
 * <p>
 * 2. int recvYHTBWFile( char *pszIPAddr, char *pszPort, char *szSndFName, int
 * iTimeOut, char *szRcvedFName);
 * <p>
 * 3. void setYHTConnTOAddr( char *pszIPAddr, char *pszPort, char
 * *pszPrepUsePath);
 * 
 * <ul>
 * 通讯响应码列表：
 * <li>0代表成功
 * <li>-1代表连接出错
 * <li>-2代表发送报文数据出错
 * <li>-3代表接收报文数据出错
 * </ul>
 *
 * @author Cruise
 * @date 2019/6/20
 */
public class Yhtsrdll {
	public interface YhtsrdllDll extends Library {
		/**
		 * TCP通讯dll加载
		 */
		YhtsrdllDll yhtsrdll = (YhtsrdllDll) Native.loadLibrary("Yhtsrdll",
				YhtsrdllDll.class);

		/**
		 * 连接代收付中心并设置结果文件存放目录
		 * 
		 * @param serverIP
		 *            代收付中心的服务器IP地址
		 * @param serverPort
		 *            代收付中心的服务器端口
		 * @param receiveFileDir
		 *            代收付中心响应结果文件本机存放目录,路径最大长度为40字节
		 */
		public void setYHTConnTOAddr(String serverIP, String serverPort,
				String receiveFileDir);

		/**
		 * 发送请求文件到代收付中心，无需接收响应结果文件
		 * 
		 * @param serverIP
		 *            代收付中心的服务器IP地址
		 * @param serverPort
		 *            代收付中心的服务器端口
		 * @param sendFilePath
		 *            发送代收付中心请求文件本机绝对路径,最大为60字节
		 * @return 通讯响应码
		 */
		public int sendYHTBWFile(String serverIP, String serverPort,
				String sendFilePath);

		/**
		 * 发送请求文件到代收付中心,并要求代收付中心返回响应结果文件到本机
		 * 
		 * @param serverIP
		 *            代收付中心的服务器IP地址
		 * @param serverPort
		 *            代收付中心的服务器端口
		 * @param sendFilePath
		 *            发送代收付中心请求文件本机绝对路径,最大为60字节
		 * @param timeOut
		 *            通讯连接超时时间,推荐为30秒
		 * @param receiveFilePath
		 *            代收付中心响应结果文件本机存放绝对路径,文件名称的存放空间由调用者分配,推荐为256个字节,
		 *            若不设定接收的报文数据文件的存放路径,则使用调用者的当前工作路径(当前工作路径长度应小于40字节)
		 * @return 通讯响应码
		 */
		public int recvYHTBWFile(String serverIP, String serverPort,
				String sendFilePath, int timeOut,
				ByteByReference receiveFilePath);
	}

	/**
	 * 发送请求文件到代收付中心，无需接收响应结果文件
	 * 
	 * @param serverIP 代收付中心的服务器IP地址
	 * @param serverPort 代收付中心的服务器端口
	 * @param receiveFileDir 代收付中心响应结果文件本机存放目录,路径最大长度为40字节
	 * @param sendFilePath 发送代收付中心请求文件本机绝对路径,最大为60字节
	 * @return 通讯响应码
	 */
	public static int sendYHTBWFile(String serverIP, String serverPort,
			String receiveFileDir, String sendFilePath) {
		YhtsrdllDll.yhtsrdll.setYHTConnTOAddr(serverIP, serverPort,
				receiveFileDir);
		int flag = YhtsrdllDll.yhtsrdll.sendYHTBWFile(null, null, sendFilePath);
		return flag;
	}

	/**
	 * 发送请求文件到代收付中心，同时接收代收付中心响应结果文件
	 * 
	 * @param serverIP 代收付中心的服务器IP地址
	 * @param serverPort 代收付中心的服务器端口
	 * @param receiveFileDir 代收付中心响应结果文件本机存放目录,路径最大长度为40字节
	 * @param sendFilePath 发送代收付中心请求文件本机绝对路径,最大为60字节
	 * @return 通讯响应码
	 */
	public static Map<String, String> recvYHTBWFile(String serverIP,
			String serverPort, String receiveFileDir, String sendFilePath) {
		Map<String, String> dataMap = new HashMap<String, String>();
		YhtsrdllDll.yhtsrdll.setYHTConnTOAddr(serverIP, serverPort,
				receiveFileDir);
		ByteByReference szRcvedFName = new ByteByReference();
		szRcvedFName.setPointer(new Memory(256 * 2));
		int code = YhtsrdllDll.yhtsrdll.recvYHTBWFile(null, null, sendFilePath,
				100, szRcvedFName);
		dataMap.put("code", String.valueOf(code));
		if (code == 0) {
			dataMap.put("rcvedFName", szRcvedFName.getPointer().getString(0, "GBK")
					.trim());
		}
		return dataMap;
	}
}